#include "Block1.h"
#include "Game.h"

/**
 * 构造方法。
 */
Block1::Block1() {
    mBlocks[1][1].mUsed = mBlocks[1][2].mUsed = mBlocks[2][1].mUsed = mBlocks[2][2].mUsed = true;
}

/**
 * 进入预览区域。
 * @param previewBitmap 预览区域位图
 */
void Block1::enterPreview(QPixmap* previewBitmap) {
    mDrawer.begin(previewBitmap);

    int x = Const::PREVIEW_WIDTH / 2 - Const::GRID_SIZE;
    int y = Const::PREVIEW_HEIGHT / 2 - Const::GRID_SIZE;

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            mDrawer.fillRect(x + Const::GRID_SIZE * j, y + Const::GRID_SIZE * i, Const::GRID_SIZE, Const::GRID_SIZE, mColor);
            Block::drawEdge(&mDrawer, x + Const::GRID_SIZE * j, y + Const::GRID_SIZE * i);
        }
    }

    mDrawer.end();
}

/**
 * 擦除。
 */
void Block1::erase() {
    QRect rect(Const::GRID_SIZE * (mLine + 1), Const::GRID_SIZE * (mRow + 1), Const::GRID_SIZE * 2, Const::GRID_SIZE * 2);

    Block::eraseRect(&rect);
}

/**
 * 获取底端所在的行数。底端是指方块最下方的有效格。
 * @return 底端所在的行数
 */
int Block1::getBottom() {
    return mRow + 2;
}

/**
 * 获取顶端所在的行数。顶端是指方块最上方的有效格。
 * @return 顶端所在的行数
 */
int Block1::getTop() {
    return mRow + 1;
}

/**
 * 对不能下落的处理。
 */
void Block1::handleCannotMoveDown() {
    Game::sExistentBlocks[mRow + 1][mLine + 1].mUsed =
    Game::sExistentBlocks[mRow + 1][mLine + 2].mUsed =
    Game::sExistentBlocks[mRow + 2][mLine + 1].mUsed =
    Game::sExistentBlocks[mRow + 2][mLine + 2].mUsed = true;
    Game::sExistentBlocks[mRow + 1][mLine + 1].mColor =
    Game::sExistentBlocks[mRow + 1][mLine + 2].mColor =
    Game::sExistentBlocks[mRow + 2][mLine + 1].mColor =
    Game::sExistentBlocks[mRow + 2][mLine + 2].mColor = mColor;
}

/**
 * 下落。
 * @return 成功则返回 true，否则返回 false
 */
bool Block1::moveDown() {
    if (mRow == 17) {
        this->handleCannotMoveDown();
        return false;
    }
    if (Game::sExistentBlocks[mRow + 3][mLine + 1].mUsed ||
        Game::sExistentBlocks[mRow + 3][mLine + 2].mUsed) {
        this->handleCannotMoveDown();
        return false;
    }

    return Block::moveDown();
}

/**
 * 左移。
 */
void Block1::moveLeft() {
    if (mLine == -1) {
        return;
    }
    if (Game::sExistentBlocks[mRow + 1][mLine].mUsed || 
        Game::sExistentBlocks[mRow + 2][mLine].mUsed) {
        return;
    }

    Block::moveLeft();
}

/**
 * 右移。
 */
void Block1::moveRight() {
    if (mLine == 7) {
        return;
    }
    if (Game::sExistentBlocks[mRow + 1][mLine + 3].mUsed || 
        Game::sExistentBlocks[mRow + 2][mLine + 3].mUsed) {
        return;
    }

    Block::moveRight();
}

/**
 * 变形。
 */
void Block1::transform() {
}
